/*
 *  yosys -- Yosys Open SYnthesis Suite
 *
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#ifndef LIBPARSE_H
#define LIBPARSE_H

#include <stdio.h>
#include <string>
#include <vector>
#include <set>

namespace Yosys
{
	struct LibertyAst
	{
		std::string id, value;
		std::vector<std::string> args;
		std::vector<LibertyAst*> children;
		~LibertyAst();
		LibertyAst *find(std::string name);
		void dump(FILE *f, std::string indent = "", std::string path = "", bool path_ok = false);
		static std::set<std::string> blacklist;
		static std::set<std::string> whitelist;
	};

	struct LibertyParser
	{
		std::istream &f;
		int line;
		LibertyAst *ast;
		LibertyParser(std::istream &f) : f(f), line(1), ast(parse()) {}
		~LibertyParser() { if (ast) delete ast; }
        
        /* lexer return values:
           'v': identifier, string, array range [...] -> str holds the token string
           'n': newline
           anything else is a single character.
        */
		int lexer(std::string &str);
		
        LibertyAst *parse();
		void error();
        void error(const std::string &str);
	};
}

#endif

